package com.fucking.great.context.common;

import cn.hutool.json.JSONObject;
import com.fucking.great.context.GreatMain;
import com.fucking.great.context.TxnContext;
import com.fucking.great.context.manager.PlugManager;
import com.fucking.great.context.manager.PlugManagerFactory;
import com.fucking.great.context.util.PrototypeUtil;

/**
 * 用于：以不同形式，调用Great内部服务。
 * 实现嵌套使用。
 */
public class CallService {

    /**
     * 内部同步转发服务。
     * @param path
     * @return
     */
    public Object forward(String path) {
        TxnContext context = TxnContext.getContext();
        //
        String oldPath = context.getPath();

        // 设置不开启组件,不提交,不回滚.
        PlugManager plugManager = context.getPlugManager();
        plugManager.setAllowBegin(false);
        plugManager.setAllowCommit(false);
        plugManager.setAllowRollaback(false);

        // 转发路径.
        context.setPath(path);
        // 执行内容。
        Object  result = GreatMain.doService(context);

        // 还原
        context.setPath(oldPath);
        plugManager.setAllowBegin(true);
        plugManager.setAllowCommit(true);
        plugManager.setAllowRollaback(true);
        return result;
    }


    /**
     * 同步重定向服务。
     * @param path
     * @return
     */
    public Object redirect(String path, JSONObject json) {
        TxnContext trunkContext = TxnContext.getContext();
        //
        PlugManager plugManager = PrototypeUtil.getPrototypeInstance(PlugManagerFactory.class);
        // 不移除主线程中的Context。
        TxnContext context = new TxnContext(plugManager){
            @Override
            public void endContext() {

            }
        };
        // 复制里面的内容
        TxnContext.copyContext(trunkContext,context);
        // 执行的路径。
        context.setPath(path);
        // 执行内容。
        Object  result = GreatMain.doService(context);
        // 把执行的日志添加到主干上。
        trunkContext.getLogList().addAll( context.getLogList());
        return result;
    }

}
